perm filename PRETTY.MAN[VLI,LSP] blob sn#382055 filedate 1978-09-08 generic text, type T, neo UTF8











                                  CHAPITRE 10

                    PRETTY-PRINT, CROSS-REFERENCE ET INDEX



     10.1  LE PRETTY-PRINT

     Les fonctions standards PRINT et PRIN1  sont  d'ordinaire  utilisees
     pour editer les S-expressions VLISP.  Les seules mesures prises pour
     ameliorer la lisibilite sont :
     - l'insertion d'un espace entre chaque atome ;
     - l'interdiction d'editer un atome (atome litteral, nombre ou chaine
     de caracteres) sur deux lignes.

     Ces mesures sont nettement insuffisantes pour editer vos programmes.
     Les fonctions du Pretty-Print vont les editer d'une maniere beaucoup
     plus lisible en faisant resortir, au moyen de renfoncements  gauches
     et  de  sauts  de  lignes  ad  hoc,  la structure de controle de vos
     fonctions.  
     Les macros-caracteres definis de maniere standard  dans  le  systeme
     (i.e.  les caracteres ' [ ] ) sont restitues par le Pretty-Print.
     En outre les LAMBDA-expressions explicites sont editees  sous  leurs
     formes LET.



     10.1.1  Les Fonctions Du Pretty-Print

     Les fonctions standards qui vont etre decrites sont de type AUTOLOAD
     (i.e.   il  n'est pas besoin de charger le fichier qui les contient,
     le systeme le fera pour vous  au  premier  appel  de  l'une  de  ces
     fonctions).
     D'ordinaire ces fonctions se trouvent dans le fichier :
        (SYS (PRETTY . VLI)) pour la version interpretee
        (SYS (PRETTY . VLA)) pour la version compilee lisible
        (SYS (PRETTY . VLO)) pour la version compilee chargeable

     Il existe une  image  memoire  contenant  le  Pretty-Print  compile.
     Cette  image  memoire se trouve (en general) dans un fichier systeme
     de nom :  VPRETTY .  Donc pour utiliser un interprete contenant deja
     un PRETTY-PRINT compile il suffit d'emettre la commande moniteur :
        .R VPRETTY
     VLISP 10 . 3    Manuel de Reference                        Page 10-2


     (PRETTYP <s>) [SUBR a 1 argument]

          edite la  S-expression  <s>.   Cette  fonction  ramene  <s>  en
          valeur.    Elle  est  utilisee  en  general  dans  vos  propres
          fonctions  qui  veulent  editer  proprement  des  S-expressions
          VLISP.


     (PRETTY <a1> <a2> ...  <aN>) [FSUBR]

          edite les definitions existantes de type  EXPR,  FEXPR,  MACRO,
          MACIN, MACOUT ou macro-caractere des differents atomes <a1> ...
          <aN> sous leurs formes DE, DF, DM,  DMI,  DMO  ou  DMC.   Cette
          fonction  ramene  toujours NIL en valeur.  Elle est utilisee en
          mise au point  conversationnelle,  pour  verifier  aisement  un
          parenthesage douteux.


     (PRETTYFILE <filout> <filin> <sw1>) [SUBR a 3 arguments]

          edite  dans  le  fichier  de  sortie   <filout>,   toutes   les
          S-expressions contenues dans le fichier d'entree <filin>.  S'il
          n'y a pas de specifications  pour  le  fichier  de  sortie  (si
          <filout> = NIL),  le  fichier  (DSK (PRETTY . VLP) () \055) est
          utilise.   L'extension  standard  des  fichiers  de  sortie  du
          Pretty-Print  est  .VLP  .  Ces fichiers peuvent etre relus par
          VLISP, mais doivent etre reformates pour utiliser l'editeur  de
          l'IRCAM ETV.
          L'indicateur  <sw1>  permet   de   controler   le   transcodage
          automatique  minuscule  majuscule :  si <sw1> = NIL, toutes les
          lettres sont traduites en majuscule, si <sw1> = T  les  lettres
          sont  restituees  dans les casses d'origine.  Si cette derniere
          option est choisie, les noms des fonctions standard ne sont pas
          reconnus s'ils apparaissent en minuscules.
          Cette fonction permet de  faire  des  copies  lisibles  de  vos
          programmes  apres  mise  au point.  De plus cette fonction a le
          bon gout de lire et de  reecrire  les  commentaires  (i.e.   la
          suite de caracteres quelconques encadree du delimiteur ";") qui
          sont d'habitude completement ignores  de  LISP.   Ceci  devrait
          vous donner l'envie de bien commenter les programmes.
          Un saut de page est effectue a chaque  occurence  du  caractere
          ↑L (Form Feed) ou a la rencontre du commentaire speciale ;PAGE;
          .
          PRETTYFILE ramene  en  valeur  le  nom  du  fichier  de  sortie
          utilise.


     (PRETTYF <file> <sw1>) [FSUBR]

          est une forme  abregee  de  la  fonction  PRETTYFILE.   L'appel
          (PRETTYF <file> <sw1>) correspond a l'appel suivant :
             (PRETTYFILE '(DSK (<file> . VLP) (GETPPN) \055) 
                    '(DSK (<file> . VLI))
     VLISP 10 . 3    Manuel de Reference                        Page 10-3


                    <sw1>)
          Cette fonction est donc  utilisee  pour  editer  d'une  maniere
          standard  un  fichier  standard.   PRETTYF  ramene la valeur du
          PRETTYFILE i.e.  le nom du fichier de sortie utilise.


     (PRETTYSIZE <n>) [SUBR a 1 argument]

          permet  d'initialiser  a  <n>  la   largeur   d'impression   du
          Pretty-Print.   Par  defaut  cette  largeur  est  de  72 ce qui
          correspond a-peu-pres au format standard 21x29,7.  Si <n> n'est
          pas  donne  ou  n'est  pas  un  nombre, la largeur standard est
          prise.  PRETTYSIZE ramene la largeur d'impression  courante  du
          Pretty-Print.


     (PRETTYEND) [SUBR a 0 argument]

          permet de recuperer la  place  occupee  par  les  fonctions  du
          PRETTY-PRINT.    PRETTYEND   remet  egalement  les  indicateurs
          AUTOLOAD de ces  fonctions.   PRETTYEND  ramene  en  valeur  le
          nombre  de  doublets liberes.  Si vous utilisez le Pretty-Print
          compile, cette fonction n'a aucun effet.



     10.1.2  Edition Des Fonctions De L'utilisateur

     Le Pretty-Print n'a pas a priori de connaissances sur les  fonctions
     de  l'utilisateur;   celles-ci  sont editees sans formatage special.
     Il est possible d'indiquer au Pretty-Print le format  souhaite  pour
     des  fonctions  particulieres  de  l'utilisateur  en  mettant sur la
     P-liste des atomes fonctions le format a utiliser sous  l'indicateur
     PRETTY.   Le  type  du format a utiliser est simplement le nom de la
     fonction standard dont on veut "imiter" le  format.   Il  n'est  pas
     possible actuellement de definir de nouveaux formats.
        ex :  (PUT 'US3 'PROGN 'PRETTY)
     indique au Pretty-Print  d'editer  la  fonction  US3  d'une  maniere
     identique a la fonction standard PROGN.

          Les formats les plus usites sont :

          PROGN     (<fonction>
                        <argument 1>
                           .....
                           .....
                        <argument N>)

          LAMBDA    (<fonction> <argument 1>
                        <argument 2>
                           .....
                           .....
                        <argument N>)
     VLISP 10 . 3    Manuel de Reference                        Page 10-4


          DE        (<fonction> <argument 1> <argument 2>
                        <argument 3>
                           .....
                           .....
                        <argument N>)

          SETQ      (<fonction>
                        <argument 1>  <argument 2>
                           ..................
                           ..................
                        <argument N-1> <argument N>)

     Pour ne pas surcharger la P-liste des atomes par des indicateurs qui
     sont   rarement  utilises,  il  est  recommande  de  ne  mettre  ces
     indicateurs qu'au  moment  de  l'edition.   La  fonction  PRETTYFILE
     (ainsi que la fonction PRETTYF) interprete les formes :
         (POUR PRETTY ...  )
     La pose des indicateurs speciaux PRETTY se fera donc avantageusement
     par cet intermediaire.
        ex :  (POUR PRETTY (PUT 'US3 'PROGN 'PRETTY))
     Cette forme, si  elle  est  lue  par  la  fonction  PRETTYFILE,  est
     equivalente  a  (PUT  'US3  'PROGN  'PRETTY) en revanche, lue par le
     TOPLEVEL (i.e.  l'evaluateur VLISP), elle est ineffective.

     Cette interpretation des POURs peuvent avoir d'autres  utilites  que
     la pose d'indicateurs 
     par exemple :
         (POUR PRETTY (STATUS 6 8))
     indique au Pretty-Print (et  a  lui  seul)  qu'il  faut  ecrire  les
     nombres en utilisant une base octale ...



     10.1.3  Exemples D'Utilisation Du Pretty-Print


     .R VPRETTY

     VLISP 10-3

       ---  ALLO ?  ---
     .REE  
     ?  (PRETTY WHOIS WHOISALL)

       (DE WHOIS (NAME LIGNE N) 
           (SETQ NAME (STRING NAME) N (STRINGL NAME))
           (DE EOF () (REMPROP 'EOF 'EXPR) (&EOF))
           (INPUT '(SYS (FACT . TXT)))
           (ESCAPE &JELAI 
              (ESCAPE &EOF 
                 (WHILE T 
                    (SETQ LIGNE (READSTR))
                    (IF (EQ NAME (SUBSTRING LIGNE 1 N)) 
     VLISP 10 . 3    Manuel de Reference                        Page 10-5


                       (&JELAI (INPUT) (SUBSTRING LIGNE (+ N 2))))))
              (INPUT)
              "Nie ma ..."))


       (DE WHOISALL () 
           (DE EOF () (REMPROP 'EOF 'EXPR) (INPUT) (&EOF))
           (INPUT '(SYS (FACT . TXT)))
           (ESCAPE &EOF (WHILE T (PRINT (READSTR)))))

     =  NIL
     =  ; time = 460 ms ;
     ?  
     ?  
     ?  (PRETTY /↑P)

       (DMC /↑P () ['PRETTY (READ)])

     =  NIL
     =  ; time = 20 ms ;
     ?  
     ?  ←
     Bye
     EXIT
     VLISP 10 . 3    Manuel de Reference                        Page 10-6


     10.2  LE CROSS-REFERENCE

     D'une maniere  identique  au  Pretty-Print,  le  Cross-Reference  va
     editer  des  fonctions  VLISP,  en  faisant  resortir  au  moyen  de
     renfoncements gauches et de sauts de lignes ad hoc,  les  structures
     de controle des fonctions.
     De plus chaque ligne en sortie est numerotee, ce qui permet  en  fin
     d'edition  d'etablir un listage des "references croissees", i.e.  la
     liste de tous les atomes litteraux, triee  par  ordre  alphabetique,
     rencontres  dans  la  (ou  les) fonction d'entree.  A cote de chaque
     atome, les numeros de lignes, dans lesquelles  apparait  cet  atome,
     sont edites, tries par ordre croissant.



     10.2.1  Les Fonctions Du Cross-Reference

     Les fonctions du Cross-Refernce qui vont etre decrites sont de  type
     AUTOLOAD  (i.e.   il  n'est pas besoin de charger le fichier qui les
     contient, le systeme le fera pour vous au premier appel de l'une  de
     ces fonctions).
     D'ordinaire ces fonctions se trouvent dans le fichier :
        (SYS (PRETTY . VLI)) pour la version interpretee
        (SYS (PRETTY . VLA)) pour la version compilee lisible
        (SYS (PRETTY . VLO)) pour la version compilee chargeable

     Les fonctions du  Cross-Reference  se  trouvent  donc  sur  le  meme
     fichier  que  les  fonctions  du Pretty-Print.  Il est donc possible
     d'utiliser l'image memoire contenant ce fichier compile.  L'appel de
     cette image memoire s'effectue au moyen de la commande moniteur :
        .R VPRETTY



     (CROSSFILE <filout> <filin> <sw1>) [SUBR a 3 arguments]

          edite  dans  le  fichier  de  sortie   <filout>,   toutes   les
          S-expressions  contenues  dans  le  fichier d'entree <filin> en
          numerotant toutes  les  lignes,  puis  toujours  dans  le  meme
          fichier  de  sortie  CROSSFILE  imprime la liste des references
          croissees de tous les atomes litteraux du fichier.
          S'il n'y a pas de specification pour le fichier de  sortie  (si
          <filout> = NIL),  le  fichier  (DSK (CROSS . VLC) () \055)  est
          utilise.   L'extension  standard  des  fichiers  de  sortie  du
          Cross-Reference  est  .VLC  .  Ces fichiers ne peuvent pas etre
          relus directement par VLISP car les lignes sont numerotees.
          L'indicateur <sw1> sert  a  specifier  s'il  faut  traiter  les
          references  aux  atomes  systemes.   Si  <sw1> = NIL, seuls les
          atomes utilisateurs seront  traites,  si  <sw1> = T,  tous  les
          atomes seront traites.
          CROSSFILE ramene le nom du fichier de sortie utilise.
     VLISP 10 . 3    Manuel de Reference                        Page 10-7


     (CROSSF <file> <sw1>) [FSUBR]

          est une  forme  abregee  de  la  fonction  CROSSFILE.   L'appel
          (CROSSF <file> <sw1>) correspond a l'appel suivant :
             (CROSSFILE '(DSK (<file> . VLC) (GETPPN) \055) 
                   '(DSK (<file> . VLI))
                   <sw1>)
          Cette fonction est donc  utilisee  pour  editer  d'une  maniere
          standard  un  fichier  standard.   CROSSF  ramene  la valeur du
          CROSSFILE i.e.  le nom du fichier de sortie utilise.


     (CROSS <at> <sw1>) [FSUBR]

          Effectue l'edition  de  la  fonction  de  nom  <at>  ainsi  que
          l'impression de ses references croisees d'une maniere identique
          a la fonction CROSSFILE.  Toutes ces impressions se  font  dans
          le fichier de sortie courant.



     10.2.2  Exemple D'utilisation Du Cross-Reference

     .R VPRETTY

     VLISP 10-3

       ---  ALLO ?  ---
     .REE  
     ?  (CROSS TYPE T)

       1     (DE TYPE (FILIN) 
       2        (INPUT FILIN)
       3        (STATUS 17 (ASCII 13) 2)
       4        (DE EOF () 
       5           (REMPROP 'EOF EXPR)
       6           (STATUS 1 20)
       7           (TERPRI)
       8           (INPUT)
       9           (&EOF))
       10       (ESCAPE &EOF (WHILE T (PRINC (READCH))))
       11       (STATUS 17 (ASCII 13) 0)
       12       FILIN)


       "Cross Reference"


        1   &EOF         9 10

        2   ASCII        3 11

        3   DE           1 4
     VLISP 10 . 3    Manuel de Reference                        Page 10-8


        4   EOF          4 5

        5   ESCAPE       10

        6   EXPR         5

        7   FILIN        1 2 12

        8   INPUT        2 8

        9   PRINC        10

        10  READCH       10

        11  REMPROP      5

        12  STATUS       3 6 11

        13  T            10

        14  TERPRI       7

        15  TYPE         1

        16  WHILE        10
     VLISP 10 . 3    Manuel de Reference                        Page 10-9


     10.3  L'INDEX (1)

     Le programme d'INDEX effectue la lecture d'un ensemble de  fonctions
     et  edite,  en  fin  de  lecture,  une  serie  de renseignements sur
     chacunes des fonctions traitees  ainsi  que  certaines  interactions
     entre les fonctions elles-meme.

     L'INDEX fourni pour chaque fonction les renseignements suivants :

     TYPE = le type de la fonction qui  peut  etre  EXPR,  FEXPR,  MACRO,
        MACIN, MACOUT ou MCHAR (pour les macros-caracteres).

     ARGS = les arguments de la fonction

     FVARS = les  variables  libres  utilisees  a  l'interieur  de  cette
        fonction.

     FVARSET = les variables libres qui sont modifiees a  l'interieur  de
        cette fonction.

     STRINGS = les constantes de  chaine  de  caracteres  utilisees  dans
        cette fonction.

     USING  =  les  fonctions  (de  l'ensemble  des  fonctions   traitees
        uniquement) qui sont appellees par cette fonction.

     USEDBY  =  les  fonctions  (de  l'ensemble  des  fonctions  traitees
        uniquement) qui appellent cette fonction.

     Ces deux derniers renseignements sont indispensables pour determiner
     l'arbre des appels des fonctions.



     10.3.1  Les Fonctions De L'INDEX

     Les fonctions de  l'INDEX  qui  vont  etre  decrites  sont  de  type
     AUTOLOAD  (i.e.   il  n'est pas besion de charger le fichier qui les
     contient, le systeme le fera pour vous  automatiquement  au  premier
     appel de l'une de ces fonctions).
     D'ordinaire ces fonctions se trouvent dans le fichier :
        (SYS (INDEX . VLI)) pour la version interpretee
        (SYS (INDEX . VLA)) pour la version compilee lisible
        (SYS (INDEX . VLO)) pour la version compilee chargeable





     --------------------------------------------------------------------

     (1) Ce programme a ete concu et realise par PATRICK GREUSSAY.
     VLISP 10 . 3    Manuel de Reference                       Page 10-10


     (INDEXFILE <filout> <filin> <sw1>) [SUBR a 3 arguments]

          traite toutes les fonctions incluses dans le  fichier  d'entree
          <filin>  et  edite  l'index de ces fonctions dans le fichier de
          sortie  <filout>.   Si  l'indicateur  <sw1>=T   les   fonctions
          apparaitront  triees  par ordre alphabetique dans le fichier de
          sortie;  si l'indicateur <sw1>=NIL, les fonctions  apparaitront
          dans  le  fichier  de  sortie  dans  le  meme ordre que dans le
          fichier d'entree.  S'il n'y a  pas  de  specification  pour  le
          fichier   de  sortie  (i.e.   si  <filout> = NIL),  le  fichier
          (DSK (INDEX . VLX) () \055) est utilise.  L'extension  standard
          des fichiers de sortie de l'INDEX est .VLX .
          INDEXFILE ramene en valeur le nom du fichier de sortie utilise.


     (INDEXF <file> <sw1>) [FSUBR]

          est une  forme  abregee  de  la  fonction  INDEXFILE.   L'appel
          (INDEXF <file> sw1>) correspond a l'appel :
               (INDEXFILE '(DSK (<file> . VLX) (GETPPN) \055)
                          '(DSK (<file> . VLI))
                          <sw1>)
          Cette fonction ramene la valeur ramenee par INDEXFILE i.e.   le
          nom du fichier de sortie utilise.



     10.3.2  Exemple De Sortie Obtenue Par L'Index


             (extrait de l'INDEX du fichier PRETTY.VLI)
                              .....
                              .....
                 ---------- CROSSFILE ----------

        TYPE = EXPR
        ARGS = (FILOUT FILIN ?CROSSALL ?INDEX  NBLINE  NBFNT)
        FVARS = (PRETTYSIZE)
        FVARSET = (PRETTYSIZE)



                 ---------- CROSSPRINT ----------

        TYPE = EXPR
        ARGS = ( NB X)
        FVARS = ( NBFNT ?INDEX)
        FVARSET = (?INDEX)
        STRINGS = ("Cross Reference")
        USEDBY = (CROSS EOF)
     VLISP 10 . 3    Manuel de Reference                       Page 10-11


                 ---------- EOF ----------

        TYPE = EXPR
        FVARS = (?INDEX FILIN FILOUT PTVRG)
        USING = (%PC &EOF CROSSPRINT PRETTYFIN)



                 ---------- FLATSIZE ----------

        TYPE = EXPR
        ARGS = (%L %N)
        USING = (ADDN FLATSIZE)
        USEDBY = (FLATSIZE SARENTRE)

                             .....
                             .....
                             .....
                                                             Page Index-1


              TABLE D'INDEX DE PRETTY, CROSS-REFERENCE ET INDEX.




     (CROSS at sw1)  FSUBR  . . . . . . 10-7
     (CROSSF file sw1)  FSUBR   . . . . 10-7
     (CROSSFILE filout filin sw1)  SUBR a 3 arguments   10-6
     (INDEXF file sw1)   FSUBR  . . . . 10-10
     (INDEXFILE filout filin sw1)   SUBR a 3 arguments  10-10
     (PRETTY at1 at2 ... atn)  FSUBR  . 10-2
     (PRETTYEND)  SUBR a 0 argument   . 10-3
     (PRETTYF file sw1)  FSUBR  . . . . 10-2
     (PRETTYFILE filout filin sw1)  SUBR a 3 arguments   10-2
     (PRETTYP s)  SUBR a 1 argument   . 10-2
     (PRETTYSIZE n)  SUBR a 1 argument    10-3

     .VLC . . . . . . . . . . . . . . . 10-6
     .VLP . . . . . . . . . . . . . . . 10-2
     .VLX . . . . . . . . . . . . . . . 10-10

     ;PAGE; . . . . . . . . . . . . . . 10-2

     CROSS-REFERENCE  . . . . . . . . . 10-6

     ETV. . . . . . . . . . . . . . . . 10-2

     INDEX  . . . . . . . . . . . . . . 10-9

     Majuscule  . . . . . . . . . . . . 10-2
     Minuscule  . . . . . . . . . . . . 10-2

     PATRICK GREUSSAY.  . . . . . . . . 10-9
     PRETTY-PRINT . . . . . . . . . . . 10-1
     PRIN1  . . . . . . . . . . . . . . 10-1
     PRINT  . . . . . . . . . . . . . . 10-1

     VPRETTY  . . . . . . . . . . . . . 10-1

     ↑L . . . . . . . . . . . . . . . . 10-2